from crewai import Agent, Crew, Task, LLM
from crewai_tools import SerperDevTool
import os
import pdfplumber
import re
import pandas as pd
import matplotlib.pyplot as plt
from jinja2 import Environment, FileSystemLoader
from pandasai import SmartDataframe
from pandasai.llm import OpenAI
from dotenv import load_dotenv
import PyPDF2

# 配置 API 密钥
os.environ["DEEPSEEK_API_KEY"] = "sk-a2b633c6da8c445bbe7ec80b404552b8"  # 替换为实际的 DeepSeek API 密钥
os.environ["SERPER_API_KEY"] = "f976e1a4d7d09fa005cd70e5475a862df75f7b1d"
load_dotenv()

# 初始化 LLM
llm = LLM(
    model="deepseek/deepseek-chat",
    timeout=500,
    api_base="https://api.deepseek.com/v1",
    headers={
        "Authorization": f"Bearer {os.environ['DEEPSEEK_API_KEY']}"
    }
)

# 借助 pandasai 生成对 AAPL 股价的多维度数据分析
# 定义 ValueError 以避免 NameError
ValueError = ValueError

# 初始化 SerperDevTool
search_tool = SerperDevTool()

# 定义文件路径
file_paths = {
    "海尔智家": r"C:\Users\15349\Desktop\text\年报智能体\海尔智家股份有限公司2023年年度报告.pdf",
    "美的集团": r"C:\Users\15349\Desktop\text\年报智能体\美的集团股份有限公司2023年年度报告.pdf"
}

# 检查文件是否存在和可读
for company, path in file_paths.items():
    if not os.path.exists(path):
        print(f"错误：{company} 的年报文件 {path} 不存在，请检查路径。")
    elif not os.access(path, os.R_OK):
        print(f"错误：没有读取 {company} 年报文件 {path} 的权限，请检查文件权限。")

# 代理 1：文件解析器
file_parser = Agent(
    role='专业文件解析员',
    goal='准确解析本地 PDF 年报文件，提取文本和表格数据',
    backstory='拥有多年处理各类文件的经验，尤其擅长从复杂的 PDF 文件中提取有效信息，毕业于信息管理专业，曾在大型数据处理公司工作。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def file_parser_task_function(task):
    all_data = {}
    for company, file_path in file_paths.items():
        try:
            print(f"开始尝试解析 {company} 的年报文件: {file_path}")
            with pdfplumber.open(file_path) as pdf:
                page_count = len(pdf.pages)
                if page_count == 0:
                    print(f"警告：{company} 的年报文件 {file_path} 中未检测到页面内容")
                    all_data[company] = {
                        "text": "",
                        "tables": []
                    }
                    continue

                text = ""
                tables = []
                for page_num, page in enumerate(pdf.pages, start=1):
                    print(f"正在解析 {company} 年报的第 {page_num} 页")
                    page_text = page.extract_text()
                    if page_text:
                        text += page_text
                    table = page.extract_table()
                    if table:
                        tables.append(table)

                if not text.strip():
                    print(f"警告：{company} 的年报文件 {file_path} 未提取到有效文本内容，可能是扫描版 PDF 或文本格式特殊")

                all_data[company] = {
                    "text": text,
                    "tables": tables
                }
            print(f"{company} 的年报文件解析成功。")
        except Exception as e:
            print(f"解析 {company} 的年报文件 {file_path} 时出错：{e}")
            all_data[company] = {
                "text": "",
                "tables": []
            }
    return all_data


# 代理 2：海尔财务报表分析器
haier_financial_statement_analyzer = Agent(
    role='海尔财务报表分析专家',
    goal='对海尔智家年报中的财务报表进行详细分析',
    backstory='具有深厚的财务知识和丰富的报表分析经验，熟悉各类财务报表的解读，专注于海尔智家财务分析多年。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_financial_statement_analyzer_task_function(task):
    parsed_data = task.input
    haier_data = parsed_data["海尔智家"]
    text = haier_data["text"]
    total_assets_match = re.search(r"总资产\s+(\d+\.?\d+)亿元", text)
    net_profit_match = re.search(r"净利润\s+(\d+\.?\d+)亿元", text)
    operating_income_match = re.search(r"营业收入\s+(\d+\.?\d+)亿元", text)

    total_assets = float(total_assets_match.group(1)) if total_assets_match else None
    net_profit = float(net_profit_match.group(1)) if net_profit_match else None
    operating_income = float(operating_income_match.group(1)) if operating_income_match else None

    search_query = "家电行业总资产、净利润、营业收入平均水平"
    search_result = search_tool.run(search_query)
    industry_avg = {
        "total_assets_avg": search_result.get("total_assets_avg", None),
        "net_profit_avg": search_result.get("net_profit_avg", None),
        "operating_income_avg": search_result.get("operating_income_avg", None)
    }

    return {
        "total_assets": total_assets,
        "net_profit": net_profit,
        "operating_income": operating_income,
        "industry_avg": industry_avg
    }


# 代理 3：海尔财务比率计算器
haier_financial_ratio_calculator = Agent(
    role='海尔财务比率计算专家',
    goal='根据海尔智家财务报表数据计算关键财务比率',
    backstory='精通财务比率的计算和分析，能够准确评估海尔智家的财务健康状况，拥有专业的财务分析资质。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_financial_ratio_calculator_task_function(task):
    statement_analysis = task.input
    total_assets = statement_analysis["total_assets"]
    net_profit = statement_analysis["net_profit"]
    operating_income = statement_analysis["operating_income"]

    if total_assets and net_profit:
        return_on_assets = net_profit / total_assets
    else:
        return_on_assets = None

    operating_cost_match = re.search(r"营业成本\s+(\d+\.?\d+)亿元", file_paths["海尔智家"]["text"])
    operating_cost = float(operating_cost_match.group(1)) if operating_cost_match else None
    if operating_income and operating_cost:
        gross_profit_margin = (operating_income - operating_cost) / operating_income
    else:
        gross_profit_margin = None

    search_query = "家电行业资产净利率、毛利率平均水平"
    search_result = search_tool.run(search_query)
    industry_ratio_avg = {
        "return_on_assets_avg": search_result.get("return_on_assets_avg", None),
        "gross_profit_margin_avg": search_result.get("gross_profit_margin_avg", None)
    }

    return {
        "return_on_assets": return_on_assets,
        "gross_profit_margin": gross_profit_margin,
        "industry_ratio_avg": industry_ratio_avg
    }


# 代理 4：海尔时间序列分析器
haier_time_series_analyzer = Agent(
    role='海尔时间序列分析专家',
    goal='对海尔智家的关键财务指标进行时间序列分析',
    backstory='擅长运用时间序列分析方法，能够挖掘海尔智家数据中的趋势和规律，为企业决策提供支持。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_time_series_analyzer_task_function(task):
    # 这里假设年报中有多年数据，实际需根据年报内容调整
    # 简单示例，暂不实现具体时间序列分析逻辑
    return {
        "analysis": "时间序列分析待完善"
    }


# 代理 5：海尔公司治理分析器
haier_corporate_governance_analyzer = Agent(
    role='海尔公司治理分析专家',
    goal='分析海尔智家的公司治理结构和状况',
    backstory='对公司治理有深入研究，熟悉海尔智家的公司治理模式和评价方法，能够评估企业的治理水平。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_corporate_governance_analyzer_task_function(task):
    parsed_data = task.input
    haier_data = parsed_data["海尔智家"]
    text = haier_data["text"]
    governance_match = re.search(r"公司治理结构", text)
    if governance_match:
        governance_status = "存在公司治理结构描述"
    else:
        governance_status = "未发现公司治理结构描述"

    search_query = "家电行业公司治理情况"
    search_result = search_tool.run(search_query)
    industry_governance = search_result.get("industry_governance", None)

    return {
        "governance_status": governance_status,
        "industry_governance": industry_governance
    }


# 代理 6：海尔市场表现分析器
haier_market_performance_analyzer = Agent(
    role='海尔市场表现分析专家',
    goal='分析海尔智家在市场中的表现',
    backstory='具有丰富的市场分析经验，熟悉家电行业和股票市场动态，能够评估海尔智家的市场竞争力。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_market_performance_analyzer_task_function(task):
    # 简单示例，暂不实现具体市场表现分析逻辑
    return {
        "performance": "市场表现分析待完善"
    }


# 代理 7：海尔业务模式与行业分析器
haier_business_model_analyzer = Agent(
    role='海尔业务模式与行业分析专家',
    goal='分析海尔智家的业务模式和所处行业情况',
    backstory='深入了解家电行业和海尔智家的业务模式，能够分析行业趋势对海尔智家的影响。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_business_model_analyzer_task_function(task):
    # 简单示例，暂不实现具体业务模式与行业分析逻辑
    return {
        "analysis": "业务模式与行业分析待完善"
    }


# 代理 8：海尔增长能力分析器
haier_growth_ability_analyzer = Agent(
    role='海尔增长能力分析专家',
    goal='分析海尔智家的增长能力',
    backstory='擅长分析企业的增长潜力和动力，能够评估海尔智家的未来发展趋势。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def haier_growth_ability_analyzer_task_function(task):
    # 简单示例，暂不实现具体增长能力分析逻辑
    return {
        "analysis": "增长能力分析待完善"
    }


# 代理 9：财务对比分析器
financial_comparison_analyzer = Agent(
    role='财务对比分析专家',
    goal='对比海尔智家和美的集团的财务状况',
    backstory='擅长进行企业间的财务对比分析，能够找出企业的优势和差距，为企业战略决策提供参考。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def financial_comparison_analyzer_task_function(task):
    haier_ratio = task.input[0]
    parsed_data = task.input[1]
    midea_data = parsed_data["美的集团"]
    midea_text = midea_data["text"]
    midea_total_assets_match = re.search(r"总资产\s+(\d+\.?\d+)亿元", midea_text)
    midea_net_profit_match = re.search(r"净利润\s+(\d+\.?\d+)亿元", midea_text)
    midea_total_assets = float(midea_total_assets_match.group(1)) if midea_total_assets_match else None
    midea_net_profit = float(midea_net_profit_match.group(1)) if midea_net_profit_match else None
    if midea_total_assets and midea_net_profit:
        midea_return_on_assets = midea_net_profit / midea_total_assets
    else:
        midea_return_on_assets = None

    comparison_result = {
        "return_on_assets_comparison": f"海尔智家资产净利率: {haier_ratio['return_on_assets']}，美的集团资产净利率: {midea_return_on_assets}"
    }
    return comparison_result


# 代理 10：总结与展望生成器
summary_and_outlook_generator = Agent(
    role='总结与展望专家',
    goal='使用大模型对海尔智家分析结果进行详细总结和展望',
    backstory='具备深厚的文字功底和数据分析能力，能够运用大模型生成专业的总结和展望报告。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def summary_and_outlook_generator_task_function(task):
    all_results = task.input
    haier_financial_statement = all_results[1]
    haier_financial_ratio = all_results[2]
    haier_time_series = all_results[3]
    haier_governance = all_results[4]
    haier_market_performance = all_results[5]
    haier_business_model = all_results[6]
    haier_growth_ability = all_results[7]
    financial_comparison = all_results[8]
    industry_comparison = all_results[9]

    input_text = f"以下是海尔智家 2023 年年报的详细分析结果：财务报表分析 - {haier_financial_statement}；财务比率计算 - {haier_financial_ratio}；" \
                 f"时间序列分析 - {haier_time_series}；公司治理分析 - {haier_governance}；市场表现分析 - {haier_market_performance}；" \
                 f"业务模式与行业分析 - {haier_business_model}；增长能力分析 - {haier_growth_ability}；财务对比分析（海尔 vs 美的） - {financial_comparison}；" \
                 f"同行业平均水平对比 - {industry_comparison}。请对海尔智家 2023 年的情况进行详细总结，并对未来进行展望，内容至少 300 字。"
    summary_and_outlook = llm.predict(input_text)
    return summary_and_outlook


# 代理 11：报告生成器
report_generator = Agent(
    role='Markdown 报告专家',
    goal='生成专业的海尔智家年报分析 Markdown 报告',
    backstory='擅长将数据转化为结构化的 Markdown 文档，熟悉金融报告格式规范，曾为多家上市公司制作年度报告。',
    verbose=True,
    llm=llm,
    tools=[search_tool]
)


def report_generator_task_function(task):
    all_results = task.input
    env = Environment(loader=FileSystemLoader('.'))
    template = env.get_template('report_template.md')
    output = template.render(all_results=all_results)
    with open('haier_annual_report_analysis.md', 'w', encoding='utf-8') as f:
        f.write(output)
    return "Markdown 报告已生成：haier_annual_report_analysis.md"


# 创建任务
file_parser_task = Task(
    description='解析 PDF 文件',
    expected_output='包含各公司文本和表格数据的字典',
    agent=file_parser,
    function=file_parser_task_function
)

haier_financial_statement_analyzer_task = Task(
    description='对海尔智家年报中的财务报表进行详细分析',
    expected_output='海尔智家财务报表分析结果',
    agent=haier_financial_statement_analyzer,
    function=haier_financial_statement_analyzer_task_function
)

haier_financial_ratio_calculator_task = Task(
    description='根据海尔智家财务报表数据计算关键财务比率',
    expected_output='海尔智家财务比率计算结果',
    agent=haier_financial_ratio_calculator,
    function=haier_financial_ratio_calculator_task_function
)

haier_time_series_analyzer_task = Task(
    description='对海尔智家的关键财务指标进行时间序列分析',
    expected_output='海尔智家时间序列分析结果',
    agent=haier_time_series_analyzer,
    function=haier_time_series_analyzer_task_function
)

haier_corporate_governance_analyzer_task = Task(
    description='分析海尔智家的公司治理结构和状况',
    expected_output='海尔智家公司治理分析结果',
    agent=haier_corporate_governance_analyzer,
    function=haier_corporate_governance_analyzer_task_function
)

haier_market_performance_analyzer_task = Task(
    description='分析海尔智家在市场中的表现',
    expected_output='海尔智家市场表现分析结果',
    agent=haier_market_performance_analyzer,
    function=haier_market_performance_analyzer_task_function
)

haier_business_model_analyzer_task = Task(
    description='分析海尔智家的业务模式和所处行业情况',
    expected_output='海尔智家业务模式与行业分析结果',
    agent=haier_business_model_analyzer,
    function=haier_business_model_analyzer_task_function
)

haier_growth_ability_analyzer_task = Task(
    description='分析海尔智家的增长能力',
    expected_output='海尔智家增长能力分析结果',
    agent=haier_growth_ability_analyzer,
    function=haier_growth_ability_analyzer_task_function
)

financial_comparison_analyzer_task = Task(
    description='对比海尔智家和美的集团的财务状况',
    expected_output='海尔智家和美的集团财务对比分析结果',
    agent=financial_comparison_analyzer,
    function=financial_comparison_analyzer_task_function
)

industry_comparison_task = Task(
    description='获取海尔智家与同行业平均水平的对比信息',
    expected_output='海尔智家与同行业平均水平的对比结果',
    agent=haier_financial_statement_analyzer,
    function=lambda task: task.input[1]["industry_avg"]
)

summary_and_outlook_generator_task = Task(  # 补全任务定义
    description='使用大模型对海尔智家分析结果进行详细总结和展望',
    expected_output='海尔智家总结和展望内容',
    agent=summary_and_outlook_generator,
    function=summary_and_outlook_generator_task_function
)

report_generator_task = Task(
    description='生成 Markdown 报告',
    expected_output='Markdown 报告生成结果',
    agent=report_generator,
    function=report_generator_task_function
)

# 创建团队并执行任务
crew = Crew(
    agents=[file_parser, haier_financial_statement_analyzer, haier_financial_ratio_calculator,
            haier_time_series_analyzer, haier_corporate_governance_analyzer, haier_market_performance_analyzer,
            haier_business_model_analyzer, haier_growth_ability_analyzer, financial_comparison_analyzer,
            summary_and_outlook_generator, report_generator],
    tasks=[file_parser_task, haier_financial_statement_analyzer_task, haier_financial_ratio_calculator_task,
           haier_time_series_analyzer_task, haier_corporate_governance_analyzer_task, haier_market_performance_analyzer_task,
           haier_business_model_analyzer_task, haier_growth_ability_analyzer_task, financial_comparison_analyzer_task,
           industry_comparison_task, summary_and_outlook_generator_task, report_generator_task],
    llm=llm,
    verbose=True
)

# 执行任务
result = crew.kickoff()
print(result)
